#pragma once
#include"exceptii.h"
#include"StringClass.h"

struct date_str
{
	char*data;

	date_str*next;

};



class List_C
{
	date_str*lista,*ultim_elem;//POINTERII LISTEI(PRIM SI ULTIM);
	int Access_Flag;//prima data trebuie sa fie 0; ARATA DACA S-A INTRODUS CEL PUTIN UN ELEMENT IN LISTA.
	int nr_of_words;//NUMARA ELEMENTELE ADAUGATE IN LISTA

public:

	List_C()
	{
		this->lista=ultim_elem=NULL;
		this->Access_Flag=0;
		nr_of_words=0;
	}

	~List_C()
	{
		delete this->lista;
	}

 void add_data(char *aux_data)
 {
	
	 if(this->Access_Flag ==0) // daca lista nu a fost folosita, doar initializata;
	 {
		 try{

			 if (this->lista!=NULL)
				 throw new exceptie(new APP_Str("Erroare la crearea listei, Pointerul listei nu este initializat NULL; \n"));
			 else
			 {
			 
				date_str*aux=new date_str;
				
				aux->data=aux_data;
				aux->next=NULL;
				this->lista=this->ultim_elem=aux;
				this->nr_of_words++;
				this->Access_Flag=1;
			 }


		 }
		 catch(exceptie &e)
		 {
			 e.show_info();
			 
		 
		 }
	 }
	 else
	 {
	 
				date_str*aux=new date_str;
				
				aux->data=aux_data;
				
				aux->next=NULL;
				
				this->ultim_elem->next=aux;
				
				this->nr_of_words++;

				this->ultim_elem=this->ultim_elem->next;
				try{
					if (this->ultim_elem->next!=NULL)
						throw new exceptie(new APP_Str("Erroare la crearea listei, Pointerul listei nu este initializat NULL; \n"));


					}
			catch(exceptie &e)
			{
				e.show_info();
				
			}
	 
	 
	 }


	 if (strlen(aux_data)==1 && strcmp(aux_data," ")==0)
		 this->nr_of_words--;


 }
 //AFISEAZA TOATA LISTA
 void print_data()
 {
	date_str*aux_parse=lista;

	while(aux_parse)
	{
		std::cout<<aux_parse->data;
		aux_parse=aux_parse->next;
		
	}
 
 }
 //VERIFICA DACA EXISTA UN ANUMIT CUVANT IN LISTA
 int is_present(char*word)
 {
	date_str*aux=lista;

	while(aux)
	{
		if(strcmp(aux->data,word)==0)
			return 1;

		aux=aux->next;
	}

	return 0;
 
 }

 date_str operator[](int index)
 {
	 return lista[index];
 
 }
 //STERGE LISTA
 void free_list()
 {
	 this->Access_Flag=0;
	 this->lista=this->ultim_elem=NULL;
     this->nr_of_words=0;
 }

 int get_Amounth_items()
 {
	return nr_of_words;
 }
 // EXPORTA LISTA CATRE UN FISIER
 void print_to_file(FILE*f)
 {
	 date_str*aux_parse=lista;

	while(aux_parse)
	{
		fprintf(f,aux_parse->data);
		aux_parse=aux_parse->next;
		
	}
	
 
 }

};



//STRUCTURA FOLOSITA PENTRU MODUL DE SCANARE STATISTIC....
// CREATA NISTE METODE IN STRUCTURA PENTRU A FI MAI USOR SA AFISEZ....
 struct statistic
 {
	char cuv[20];

	int aparitii_fis1,
		aparitii_fis2;

	statistic*next;

	void print_data(FILE*f)
	{
			if(f)
				fprintf(f,"%s     %d      %d \n",cuv,aparitii_fis1,aparitii_fis2);
			else{

					std::cout<<cuv<<"  "<<" "<<this->aparitii_fis1<<"       "<< this->aparitii_fis2<<"\n";
			}
	}
	//-----UMPLE VECTORUL CU SPATII, DUPA CE A FOST INTRODUS UN CUVANT IN ---CUV---,
	//RESTUL DE LA 20-(LUNGIMEA CUVANTULUI ) SE VA UMPLE CU SPATII PENTRU AFISARE....
	void fill_cuv()
	{
			for(int i=strlen(this->cuv);i<19;i++)
				this->cuv[i]=' ';
				

		this->cuv[19]='\0';
	}

 };

